import router from "@/router";
import {useUserStore, usePermissionStore} from "@/store";
import NProgress from "@/utils/nprogress";
import {RouteRecordRaw} from "vue-router";
import {TOKEN_KEY} from "@/enums/CacheEnum";

// 是否有权限
export function hasAuth(
    value: string | string[],
    type: "button" | "role" = "button"
) {
    const {roles, perms} = useUserStore().user;
    //「超级管理员」拥有所有的按钮权限
    if (type === "button" && roles.includes("ROOT")) {
        return true;
    }
    const auths = type === "button" ? perms : roles;
    return typeof value === "string"
        ? auths.includes(value)
        : auths.some((perm) => {
            return value.includes(perm);
        });
}

export function setupPermission() {
    // 白名单路由
    const whiteList = ["/login","/404","/401"];

    router.beforeEach(async (to, from, next) => {
        NProgress.start();
        const hasToken = sessionStorage.getItem(TOKEN_KEY);
        if (hasToken) {
            if (to.path === "/login") {
                // 如果已登录，跳转首页
                next({path: "/"});
                NProgress.done();
            } else {
                const userStore = useUserStore();
                const hasRoles =
                    userStore.user.roles && userStore.user.roles.length > 0;
                if (hasRoles) {
                    // 未匹配到任何路由，跳转404
                    if (to.matched.length === 0) {
                        from.name ? next({name: from.name}) : next("/404");
                    } else {
                        next();
                    }
                } else {
                    const permissionStore = usePermissionStore();
                    try {
                        const {roles, menus} = await userStore.getUserInfo();
                        if (!menus || menus.length === 0) {
                            await ElMessageBox.alert("暂无菜单权限，请联系管理员！", "提示", {
                                confirmButtonText: "确定",
                                type: "error",
                                callback: () => {
                                    userStore.logout();
                                }
                            })
                        } else {
                            const accessRoutes = permissionStore.generateRoutes(menus);
                            accessRoutes.forEach((route: RouteRecordRaw) => {
                                router.addRoute(route);
                            });
                            next({...to, replace: true});
                        }
                    } catch (error) {
                        console.log(error);
                        // 移除 token 并跳转登录页
                        await userStore.resetToken();
                        next(`/login?redirect=${to.path}`);
                        NProgress.done();
                    }
                }
            }
        } else {
            // 未登录可以访问白名单页面
            if (whiteList.indexOf(to.path) !== -1) {
                next();
            } else {
                next(`/login?redirect=${to.path}`);
                NProgress.done();
            }
        }
    });

    router.afterEach(() => {
        NProgress.done();
    });
}
